package com.chunlin.set;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetTest {
    //注意：
    //1. Set是继承自Collection的一个接口类
    //2. Set中只存储了key，并且要求key一定要唯一
    //3. TreeSet的底层是使用TreeMap来实现的，其使用的key与Object的一个默认对象作为键值对插入到Map中的
    //键：在 TreeSet 中添加的每个元素都被当作 TreeMap 的键
    //值：TreeMap 的值是一个静态的、不变的对象，通常是 private static final Object PRESENT = new Object();
    // 这个对象不携带任何有意义的数据，只是起到占位的作用
    //4. Set最大的功能就是对集合中的元素进行去重
    //5. 实现Set接口的常用类有TreeSet和HashSet，还有一个LinkedHashSet，LinkedHashSet是在HashSet的基础
    //上维护了一个双向链表来记录元素的插入次序
    //6. Set中的Key不能修改，如果要修改，先将原来的删除掉，然后再重新插入
    //7. TreeSet中不能插入null的key，HashSet可以
    public static void main(String[] args) {
        test1();
    }

    private static void test1() {
        TreeSet<String> s = new TreeSet<>();

        // add(key): 如果key不存在，则插入，返回ture
        // 如果key存在，返回false
        boolean isIn = s.add("apple");
        s.add("orange");
        s.add("peach");
        s.add("banana");
        System.out.println(s.size());
        System.out.println(s);

        // add(key): key如果是空，抛出空指针异常
        //s.add(null);

        //判断 o 是否在集合中
        System.out.println(s.contains("orange"));
        System.out.println(s.contains("oranges"));


        // remove(key): key存在，删除成功返回true
        // key不存在，删除失败返回false
        // key为空，抛出空指针异常
        s.remove("apple");
        System.out.println(s);

        s.remove("watermelon;");
        System.out.println(s);

        Iterator<String> iterator = s.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next() + " ");
        }
        System.out.println();

        //这里 new String[0] 只是用来指示数组的目标类型，实际上 JVM 会根据集合的大小创建一个新的数组，这样做是为了类型安全并避免运行时错误
        String[] array = s.toArray(new String[0]);
        for (String e : array) {
            System.out.println(e + " ");
        }

        //集合c中的元素是否在set中全部存在，是返回true，否则返回false
        ArrayList<String> test = new ArrayList<>();
        test.add("banana");
        test.add("orange");
        System.out.println(s.containsAll(test));

    }
}

